package cn.org.xiaoweiba.main.dto.result;

import java.io.Serial;
import java.io.Serializable;
import java.util.Objects;

/**
 * 用于封装成功响应结果的响应结果类
 */
public class SuccessRespResult<T> extends BaseRespResult<T> implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 构造成功响应结果对象
     */
    public SuccessRespResult() {
    }

    /**
     * 构造指定响应状态码的成功响应结果对象
     *
     * @param code 响应状态码
     */
    public SuccessRespResult(Integer code) {
        super(code);
    }

    /**
     * 构造指定响应状态码、响应信息的成功响应结果对象
     *
     * @param code    响应状态码
     * @param message 响应信息
     */
    public SuccessRespResult(Integer code, String message) {
        super(code, message);
    }

    /**
     * 构造指定响应状态码和响应数据的成功响应结果对象
     *
     * @param code    响应状态码
     * @param data    响应数据
     */
    public SuccessRespResult(Integer code, T data) {
        super(code, data);
    }

    /**
     * 构造指定响应状态码、响应信息和响应数据的成功响应结果对象
     *
     * @param code    响应状态码
     * @param message 响应信息
     * @param data    响应数据
     */
    public SuccessRespResult(Integer code, String message, T data) {
        super(code, message, data);
    }

    /**
     * 获取响应状态码为 200、响应信息为 "成功" 的成功响应结果对象
     *
     * @return 响应状态码为 200、响应信息为 "成功" 的成功响应结果对象
     */
    public static SuccessRespResult<Object> successRespResult() {
        return new SuccessRespResult<>(RespCode.OK.getCode(), RespCode.OK.getMessage());
    }

    /**
     * 获取响应信息为 "成功" 的成功响应结果对象
     *
     * @param code 响应状态码
     * @return 响应信息为 "成功" 的成功响应结果对象
     */
    public static SuccessRespResult<Object> successRespResult(Integer code) {
        if (Objects.isNull(code)) code = RespCode.OK.getCode();
        return new SuccessRespResult<>(code, RespCode.OK.getMessage());
    }

    /**
     * 获取响应状态码为 200 的成功响应结果对象
     *
     * @param message 响应信息
     * @return 响应状态码为 200 的成功响应结果对象
     */
    public static SuccessRespResult<Object> successRespResult(String message) {
        if (Objects.isNull(message)) message = RespCode.OK.getMessage();
        return new SuccessRespResult<>(RespCode.OK.getCode(), message);
    }

    /**
     * 获取响应状态码为 200、响应信息为 "成功" 的成功响应结果对象
     *
     * @param data 响应数据
     * @return 响应状态码为 200、响应信息为 "成功" 的成功响应结果对象
     */
    public static SuccessRespResult<Object> successRespResult(Object data) {
        return new SuccessRespResult<>(RespCode.OK.getCode(), RespCode.OK.getMessage(), data);
    }

    /**
     * 获取成功响应结果对象
     *
     * @param code 响应状态码
     * @param message 响应信息
     * @return 成功响应结果对象
     */
    public static SuccessRespResult<Object> successRespResult(Integer code, String message) {
        if (Objects.isNull(code)) code = RespCode.OK.getCode();
        if (Objects.isNull(message)) message = RespCode.OK.getMessage();
        return new SuccessRespResult<>(code, message);
    }

    /**
     * 获取响应信息为 "成功" 的成功响应结果对象
     *
     * @param code 响应状态码
     * @param data 响应数据
     * @return 响应信息为 "成功" 的成功响应结果对象
     */
    public static SuccessRespResult<Object> successRespResult(Integer code, Object data) {
        if (Objects.isNull(code)) code = RespCode.OK.getCode();
        return new SuccessRespResult<>(code, RespCode.OK.getMessage(), data);
    }

    /**
     * 获取响应状态码为 200 的成功响应结果对象
     *
     * @param message 响应信息
     * @param data 响应数据
     * @return 响应状态码为 200 的成功响应结果对象
     */
    public static SuccessRespResult<Object> successRespResult(String message, Object data) {
        if (Objects.isNull(message)) message = RespCode.OK.getMessage();
        return new SuccessRespResult<>(RespCode.OK.getCode(), message, data);
    }

    /**
     * 获取成功响应结果对象
     *
     * @param code 响应状态码
     * @param message 响应信息
     * @param data 响应数据
     * @return 成功响应结果对象
     */
    public static SuccessRespResult<Object> successRespResult(Integer code, String message, Object data) {
        if (Objects.isNull(code)) code = RespCode.OK.getCode();
        if (Objects.isNull(message)) message = RespCode.OK.getMessage();
        return new SuccessRespResult<>(code, message, data);
    }

}
